public class MyQueue {
    static class Node {
        public int val;
        public Node next;

        public Node(int val) {
            this.val = val;
        }
    }

    public Node head;
    public Node last;
    public int usedSize;

    //入队
    public void offer(int val) {
        Node node = new Node(val);
        if (head == null) {//当没有单链表的时候，插入一个节点，head和last都指向这个节点。
            head = node;
            last = node;
        } else {//当链表不为空的时候，尾插法实现入栈
            last.next = node;//链接node节点
            last = node;//last指针后移
        }
        usedSize++;//记录队列当中有多少个元素
    }
    //出队
    public int poll(){
        if(empty()){//队列是否为空，若为空返回-1或者抛异常，不为空，将元素抛出。
            //这里可以抛异常，也可以直接返回-1
            return -1;//若链表为空，则返回-1.
        }
        int ret = head.val;//将出队列的值，记录下来
        head = head.next;
        if(head == null){//当head后移，将元素删完head=null时，队列当中应该没有元素了所以last也要置为空，否则last还引用队列当中的元素
            last = null;
        }
        usedSize--;
        return ret;
    }
    public boolean empty(){//判断链表是否为空
        return usedSize == 0;
    }
    //查看队头元素
    public int peek(){
        if(empty()){
            throw new EmptyException("队列为空");
        }
        return head.val;
    }
    //查看队列当中的元素个数
    public int getUsedSize(){
        return usedSize;
    }
}
